package com.rubiksillusions;

public class Cubelet {
	private Facelet[] facelets = new Facelet[6];
	
	public Cubelet(int a, int b, int c, int d, int e, int f) {
		facelets[0] = new Facelet(this, 0, SemiAxis.XP, new Color(a));
		facelets[1] = new Facelet(this, 0, SemiAxis.ZN, new Color(b));
		facelets[2] = new Facelet(this, 0, SemiAxis.YP, new Color(c));
		facelets[3] = new Facelet(this, 0, SemiAxis.YN, new Color(d));
		facelets[4] = new Facelet(this, 0, SemiAxis.ZP, new Color(e));
		facelets[5] = new Facelet(this, 0, SemiAxis.XN, new Color(f));
	}
	
	public Facelet getFacelet(int semiAxis) {
		for (int i = 0; i < 6; i++) {
			if (semiAxis == facelets[i].getSemiAxis()) return facelets[i];
		}
		return null;
	}
	
	public Cubelet clone() {
		return new Cubelet(getFacelet(SemiAxis.XP).getColor().getNumber(), getFacelet(SemiAxis.ZN).getColor().getNumber(),
				getFacelet(SemiAxis.YP).getColor().getNumber(), getFacelet(SemiAxis.YN).getColor().getNumber(), 
				getFacelet(SemiAxis.ZP).getColor().getNumber(), getFacelet(SemiAxis.XN).getColor().getNumber());
	}
	/*
	public int getFaceletColor(int face) {
		return colors[face];
	}
	*/
	
	
	
	//private int[] colors = { -1, -1, -1, -1, -1, -1 };
	/*
	public Cubelet() {
	}*/
	/*
	public Cubelet(int[] colors) {
		this();
		this.colors = colors;
	}
	*/
	/*
	public void setFacelet(int face, int color) {
		colors[face] = color;
	}
	*/
	
	/*
	public int[] getFaceletColorsArray() {
		return colors.clone();
	}*/
	
	public void rotation(int axis) {
		for (int i = 0; i < 6; i++) {
			facelets[i].rotation(axis);
		}
	}
	
	public int getNumber() {
		if (getFacelet(SemiAxis.XP).getColor().getNumber() == -1 && getFacelet(SemiAxis.ZN).getColor().getNumber() == -1 && getFacelet(SemiAxis.YP).getColor().getNumber() != -1 &&
				getFacelet(SemiAxis.YN).getColor().getNumber() == -1 && getFacelet(SemiAxis.ZP).getColor().getNumber() != -1 && getFacelet(SemiAxis.XN).getColor().getNumber() != -1) return 0;
		if (getFacelet(SemiAxis.XP).getColor().getNumber() == -1 && getFacelet(SemiAxis.ZN).getColor().getNumber() == -1 && getFacelet(SemiAxis.YP).getColor().getNumber() != -1 &&
				getFacelet(SemiAxis.YN).getColor().getNumber() == -1 && getFacelet(SemiAxis.ZP).getColor().getNumber() != -1 && getFacelet(SemiAxis.XN).getColor().getNumber() == -1) return 1;
		if (getFacelet(SemiAxis.XP).getColor().getNumber() != -1 && getFacelet(SemiAxis.ZN).getColor().getNumber() == -1 && getFacelet(SemiAxis.YP).getColor().getNumber() != -1 &&
				getFacelet(SemiAxis.YN).getColor().getNumber() == -1 && getFacelet(SemiAxis.ZP).getColor().getNumber() != -1 && getFacelet(SemiAxis.XN).getColor().getNumber() == -1) return 2;
		if (getFacelet(SemiAxis.XP).getColor().getNumber() == -1 && getFacelet(SemiAxis.ZN).getColor().getNumber() == -1 && getFacelet(SemiAxis.YP).getColor().getNumber() != -1 &&
				getFacelet(SemiAxis.YN).getColor().getNumber() == -1 && getFacelet(SemiAxis.ZP).getColor().getNumber() == -1 && getFacelet(SemiAxis.XN).getColor().getNumber() != -1) return 3;
		if (getFacelet(SemiAxis.XP).getColor().getNumber() == -1 && getFacelet(SemiAxis.ZN).getColor().getNumber() == -1 && getFacelet(SemiAxis.YP).getColor().getNumber() != -1 &&
				getFacelet(SemiAxis.YN).getColor().getNumber() == -1 && getFacelet(SemiAxis.ZP).getColor().getNumber() == -1 && getFacelet(SemiAxis.XN).getColor().getNumber() == -1) return 4;
		if (getFacelet(SemiAxis.XP).getColor().getNumber() != -1 && getFacelet(SemiAxis.ZN).getColor().getNumber() == -1 && getFacelet(SemiAxis.YP).getColor().getNumber() != -1 &&
				getFacelet(SemiAxis.YN).getColor().getNumber() == -1 && getFacelet(SemiAxis.ZP).getColor().getNumber() == -1 && getFacelet(SemiAxis.XN).getColor().getNumber() == -1) return 5;
		if (getFacelet(SemiAxis.XP).getColor().getNumber() == -1 && getFacelet(SemiAxis.ZN).getColor().getNumber() != -1 && getFacelet(SemiAxis.YP).getColor().getNumber() != -1 &&
				getFacelet(SemiAxis.YN).getColor().getNumber() == -1 && getFacelet(SemiAxis.ZP).getColor().getNumber() == -1 && getFacelet(SemiAxis.XN).getColor().getNumber() != -1) return 6;
		if (getFacelet(SemiAxis.XP).getColor().getNumber() == -1 && getFacelet(SemiAxis.ZN).getColor().getNumber() != -1 && getFacelet(SemiAxis.YP).getColor().getNumber() != -1 &&
				getFacelet(SemiAxis.YN).getColor().getNumber() == -1 && getFacelet(SemiAxis.ZP).getColor().getNumber() == -1 && getFacelet(SemiAxis.XN).getColor().getNumber() == -1) return 7;
		if (getFacelet(SemiAxis.XP).getColor().getNumber() != -1 && getFacelet(SemiAxis.ZN).getColor().getNumber() != -1 && getFacelet(SemiAxis.YP).getColor().getNumber() != -1 &&
				getFacelet(SemiAxis.YN).getColor().getNumber() == -1 && getFacelet(SemiAxis.ZP).getColor().getNumber() == -1 && getFacelet(SemiAxis.XN).getColor().getNumber() == -1) return 8;
		if (getFacelet(SemiAxis.XP).getColor().getNumber() == -1 && getFacelet(SemiAxis.ZN).getColor().getNumber() == -1 && getFacelet(SemiAxis.YP).getColor().getNumber() == -1 &&
				getFacelet(SemiAxis.YN).getColor().getNumber() == -1 && getFacelet(SemiAxis.ZP).getColor().getNumber() != -1 && getFacelet(SemiAxis.XN).getColor().getNumber() != -1) return 9;
		if (getFacelet(SemiAxis.XP).getColor().getNumber() == -1 && getFacelet(SemiAxis.ZN).getColor().getNumber() == -1 && getFacelet(SemiAxis.YP).getColor().getNumber() == -1 &&
				getFacelet(SemiAxis.YN).getColor().getNumber() == -1 && getFacelet(SemiAxis.ZP).getColor().getNumber() != -1 && getFacelet(SemiAxis.XN).getColor().getNumber() == -1) return 10;
		if (getFacelet(SemiAxis.XP).getColor().getNumber() != -1 && getFacelet(SemiAxis.ZN).getColor().getNumber() == -1 && getFacelet(SemiAxis.YP).getColor().getNumber() == -1 &&
				getFacelet(SemiAxis.YN).getColor().getNumber() == -1 && getFacelet(SemiAxis.ZP).getColor().getNumber() != -1 && getFacelet(SemiAxis.XN).getColor().getNumber() == -1) return 11;
		if (getFacelet(SemiAxis.XP).getColor().getNumber() == -1 && getFacelet(SemiAxis.ZN).getColor().getNumber() == -1 && getFacelet(SemiAxis.YP).getColor().getNumber() == -1 &&
				getFacelet(SemiAxis.YN).getColor().getNumber() == -1 && getFacelet(SemiAxis.ZP).getColor().getNumber() == -1 && getFacelet(SemiAxis.XN).getColor().getNumber() != -1) return 12;
		if (getFacelet(SemiAxis.XP).getColor().getNumber() == -1 && getFacelet(SemiAxis.ZN).getColor().getNumber() == -1 && getFacelet(SemiAxis.YP).getColor().getNumber() == -1 &&
				getFacelet(SemiAxis.YN).getColor().getNumber() == -1 && getFacelet(SemiAxis.ZP).getColor().getNumber() == -1 && getFacelet(SemiAxis.XN).getColor().getNumber() == -1) return 13;
		if (getFacelet(SemiAxis.XP).getColor().getNumber() != -1 && getFacelet(SemiAxis.ZN).getColor().getNumber() == -1 && getFacelet(SemiAxis.YP).getColor().getNumber() == -1 &&
				getFacelet(SemiAxis.YN).getColor().getNumber() == -1 && getFacelet(SemiAxis.ZP).getColor().getNumber() == -1 && getFacelet(SemiAxis.XN).getColor().getNumber() == -1) return 14;
		if (getFacelet(SemiAxis.XP).getColor().getNumber() == -1 && getFacelet(SemiAxis.ZN).getColor().getNumber() != -1 && getFacelet(SemiAxis.YP).getColor().getNumber() == -1 &&
				getFacelet(SemiAxis.YN).getColor().getNumber() == -1 && getFacelet(SemiAxis.ZP).getColor().getNumber() == -1 && getFacelet(SemiAxis.XN).getColor().getNumber() != -1) return 15;
		if (getFacelet(SemiAxis.XP).getColor().getNumber() == -1 && getFacelet(SemiAxis.ZN).getColor().getNumber() != -1 && getFacelet(SemiAxis.YP).getColor().getNumber() == -1 &&
				getFacelet(SemiAxis.YN).getColor().getNumber() == -1 && getFacelet(SemiAxis.ZP).getColor().getNumber() == -1 && getFacelet(SemiAxis.XN).getColor().getNumber() == -1) return 16;
		if (getFacelet(SemiAxis.XP).getColor().getNumber() != -1 && getFacelet(SemiAxis.ZN).getColor().getNumber() != -1 && getFacelet(SemiAxis.YP).getColor().getNumber() == -1 &&
				getFacelet(SemiAxis.YN).getColor().getNumber() == -1 && getFacelet(SemiAxis.ZP).getColor().getNumber() == -1 && getFacelet(SemiAxis.XN).getColor().getNumber() == -1) return 17;
		if (getFacelet(SemiAxis.XP).getColor().getNumber() == -1 && getFacelet(SemiAxis.ZN).getColor().getNumber() == -1 && getFacelet(SemiAxis.YP).getColor().getNumber() == -1 &&
				getFacelet(SemiAxis.YN).getColor().getNumber() != -1 && getFacelet(SemiAxis.ZP).getColor().getNumber() != -1 && getFacelet(SemiAxis.XN).getColor().getNumber() != -1) return 18;
		if (getFacelet(SemiAxis.XP).getColor().getNumber() == -1 && getFacelet(SemiAxis.ZN).getColor().getNumber() == -1 && getFacelet(SemiAxis.YP).getColor().getNumber() == -1 &&
				getFacelet(SemiAxis.YN).getColor().getNumber() != -1 && getFacelet(SemiAxis.ZP).getColor().getNumber() != -1 && getFacelet(SemiAxis.XN).getColor().getNumber() == -1) return 19;
		if (getFacelet(SemiAxis.XP).getColor().getNumber() != -1 && getFacelet(SemiAxis.ZN).getColor().getNumber() == -1 && getFacelet(SemiAxis.YP).getColor().getNumber() == -1 &&
				getFacelet(SemiAxis.YN).getColor().getNumber() != -1 && getFacelet(SemiAxis.ZP).getColor().getNumber() != -1 && getFacelet(SemiAxis.XN).getColor().getNumber() == -1) return 20;
		if (getFacelet(SemiAxis.XP).getColor().getNumber() == -1 && getFacelet(SemiAxis.ZN).getColor().getNumber() == -1 && getFacelet(SemiAxis.YP).getColor().getNumber() == -1 &&
				getFacelet(SemiAxis.YN).getColor().getNumber() != -1 && getFacelet(SemiAxis.ZP).getColor().getNumber() == -1 && getFacelet(SemiAxis.XN).getColor().getNumber() != -1) return 21;
		if (getFacelet(SemiAxis.XP).getColor().getNumber() == -1 && getFacelet(SemiAxis.ZN).getColor().getNumber() == -1 && getFacelet(SemiAxis.YP).getColor().getNumber() == -1 &&
				getFacelet(SemiAxis.YN).getColor().getNumber() != -1 && getFacelet(SemiAxis.ZP).getColor().getNumber() == -1 && getFacelet(SemiAxis.XN).getColor().getNumber() == -1) return 22;
		if (getFacelet(SemiAxis.XP).getColor().getNumber() != -1 && getFacelet(SemiAxis.ZN).getColor().getNumber() == -1 && getFacelet(SemiAxis.YP).getColor().getNumber() == -1 &&
				getFacelet(SemiAxis.YN).getColor().getNumber() != -1 && getFacelet(SemiAxis.ZP).getColor().getNumber() == -1 && getFacelet(SemiAxis.XN).getColor().getNumber() == -1) return 23;
		if (getFacelet(SemiAxis.XP).getColor().getNumber() == -1 && getFacelet(SemiAxis.ZN).getColor().getNumber() != -1 && getFacelet(SemiAxis.YP).getColor().getNumber() == -1 &&
				getFacelet(SemiAxis.YN).getColor().getNumber() != -1 && getFacelet(SemiAxis.ZP).getColor().getNumber() == -1 && getFacelet(SemiAxis.XN).getColor().getNumber() != -1) return 24;
		if (getFacelet(SemiAxis.XP).getColor().getNumber() == -1 && getFacelet(SemiAxis.ZN).getColor().getNumber() != -1 && getFacelet(SemiAxis.YP).getColor().getNumber() == -1 &&
				getFacelet(SemiAxis.YN).getColor().getNumber() != -1 && getFacelet(SemiAxis.ZP).getColor().getNumber() == -1 && getFacelet(SemiAxis.XN).getColor().getNumber() == -1) return 25;
		if (getFacelet(SemiAxis.XP).getColor().getNumber() != -1 && getFacelet(SemiAxis.ZN).getColor().getNumber() != -1 && getFacelet(SemiAxis.YP).getColor().getNumber() == -1 &&
				getFacelet(SemiAxis.YN).getColor().getNumber() != -1 && getFacelet(SemiAxis.ZP).getColor().getNumber() == -1 && getFacelet(SemiAxis.XN).getColor().getNumber() == -1) return 26;
		return -1;
	}
	
	public boolean isCentralPiece() {
		switch (getNumber()) {
			case 4:
			case 10:
			case 12:
			case 14:
			case 16:
			case 22:
				return true;
		}
		return false;
	}
	
	public boolean isEdge() {
		switch (getNumber()) {
			case 1:
			case 3:
			case 5:
			case 7:
			case 9:
			case 11:
			case 15:
			case 17:
			case 19:
			case 21:
			case 23:
			case 25:
				return true;
		}
		return false;
	}
	
	public boolean isCorner() {
		switch (getNumber()) {
			case 0:
			case 2:
			case 6:
			case 8:
			case 18:
			case 20:
			case 24:
			case 26:
				return true;
		}
		return false;
	}
}
